package com.pan.games.threadgame.pool;

import java.util.concurrent.*;

/**
 *
 *
 * @author by panstark
 * @description
 * @notice
 * @date 2020/12/16
 */
public class PoolInfo {

    /**
     *禁止使用Executors
     *
     * Java中的BlockingQueue主要有两种实现，分别是ArrayBlockingQueue 和 LinkedBlockingQueue。
     *
     * ArrayBlockingQueue是一个用数组实现的有界阻塞队列，必须设置容量。
     *
     * LinkedBlockingQueue是一个用链表实现的有界阻塞队列，容量可以选择进行设置。
     * 不设置的话，将是一个无边界的阻塞队列，最大长度为Integer.MAX_VALUE。
     *
     * 这里的问题就出在：**不设置的话，将是一个无边界的阻塞队列，最大长度为Integer.MAX_VALUE。
     * 也就是说，如果我们不设置LinkedBlockingQueue的容量的话，其默认容量将会是Integer.MAX_VALUE。
     *
     * 而newFixedThreadPool中创建LinkedBlockingQueue时，并未指定容量。
     * 此时，LinkedBlockingQueue就是一个无边界队列，对于一个无边界队列来说，是可以不断的向队列中加入任务的，这种情况下就有可能因为任务过多而导致内存溢出问题。
     *
     * 上面提到的问题主要体现在newFixedThreadPool和newSingleThreadExecutor两个工厂方法上，
     * 并不是说newCachedThreadPool和newScheduledThreadPool这两个方法就安全了，这两种方式创建的最大线程数可能是Integer.MAX_VALUE，
     * 而创建这么多线程，必然就有可能导致OOM。
     */
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);


    /**
     * 自定义的线程池主要要限定队列
     */
    ExecutorService executor = new ThreadPoolExecutor(10, 10, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue(10));

    ExecutorService newcachedThreadPool = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());

    ExecutorService newfixedThreadPool=new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1000));

    ExecutorService newSingleThreadExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1000));






}
